# -*- coding: utf-8 -*-
"""
文章DTO（数据传输对象）
目的：定义文章相关的请求和响应数据结构，提供类型安全和数据验证
职责：封装API请求参数，替代多参数传递，提升代码可维护性
使用场景：Controller层和Service层之间的数据传递
"""
from dataclasses import dataclass
from typing import Optional


@dataclass
class CreateArticleRequest:
    """
    创建文章请求对象
    目的：封装文章创建所需的所有参数，避免方法参数过多
    使用场景：Controller接收到创建文章请求后，将数据封装为此对象传递给Service层
    """
    # 作者ID，从JWT令牌中获取的当前登录用户ID
    author_id: int

    # 文章标题，必填项，最长255字符
    title: str

    # 文章内容，必填项，支持HTML或Markdown格式
    content: str

    # 文章摘要，必填项，用于列表页显示
    summary: str

    # 分类ID，必填项，必须是有效的分类
    category_id: int

    # 文章标签，必填项，多个标签用逗号分隔
    tags: str

    # 封面图片路径，可选项
    cover_image: Optional[str] = None

    # 地理位置ID，可选项
    location_id: Optional[int] = None

    # 文章状态，默认1表示已发布，0表示草稿，2表示下线
    status: int = 1


@dataclass
class GetArticlesListRequest:
    """
    获取文章列表请求对象
    目的：封装文章列表查询的所有筛选和分页参数
    使用场景：Controller接收到列表查询请求后，将查询条件封装为此对象传递给Service层
    """
    # 页码，从1开始，默认第1页
    page: int = 1

    # 每页显示数量，默认10条，最大100条
    page_size: int = 10

    # 分类ID筛选，None表示不限分类
    category_id: Optional[int] = None

    # 文章状态筛选，0-草稿，1-已发布，2-下线，None表示不限
    status: Optional[int] = None

    # 作者ID筛选，None表示不限作者
    author_id: Optional[int] = None

    # 关键词搜索，搜索标题和摘要，None表示不搜索
    keyword: Optional[str] = None

    # 是否置顶筛选，0-否，1-是，None表示不限
    is_top: Optional[int] = None
